package jmine.tec.hydra.exception;

import jmine.tec.hydra.api.HydraRequest;
import bancosys.tec.exception.AbstractRuntimeException;
import bancosys.tec.exception.LocalizedMessageHolder;
import bancosys.tec.exception.MessageHolder;

/**
 * Exception de erros originados de envio/recebimento de mensagens.
 * 
 * @author piercio
 */
public class HydraException extends AbstractRuntimeException {

    public static final String BUNDLE_NAME = "hydra-messages";

    private HydraRequest request;

    /**
     * @return request onde a exceção foi causada.
     */
    public HydraRequest getRequest() {
        if (this.request == null) {
            throw new NullPointerException("O request não foi definido na exceção!");
        }
        return this.request;
    }

    /**
     * @param request request onde a exceção foi causada.
     */
    public void setRequest(HydraRequest request) {
        this.request = request;
    }

    /**
     * C'tor
     * 
     * @param key A CHAVE do arquivo de i18n.
     * @param arguments ARGUMENTOS da mensagem, se houver.
     * @deprecated use LocalizedMessageHolder
     */
    @Deprecated
    public HydraException(String key, Object... arguments) {
        this(new MessageHolder(BUNDLE_NAME, key, arguments));
    }

    /**
     * C'tor
     * 
     * @param key A CHAVE do arquivo de i18n.
     * @param cause a CAUSA desta exception.
     * @param arguments ARGUMENTOS da mensagem, se houver.
     * @deprecated use LocalizedMessageHolder
     */
    @Deprecated
    public HydraException(String key, Throwable cause, Object... arguments) {
        this(new MessageHolder(BUNDLE_NAME, key, arguments), cause);
    }

    /**
     * @param request request onde a integração foi causada.
     * @param key A CHAVE do arquivo de i18n.
     * @param cause a CAUSA desta exception.
     * @param arguments ARGUMENTOS da mensagem, se houver.
     * @deprecated use LocalizedMessageHolder
     */
    @Deprecated
    public HydraException(HydraRequest request, String key, Throwable cause, Object... arguments) {
        this(key, cause, arguments);
        this.request = request;
    }

    /**
     * Ctor
     * 
     * @param request request onde a integração foi causada.
     * @param messageHolder the {@link LocalizedMessageHolder}
     * @param cause the {@link Throwable}
     */
    public HydraException(HydraRequest request, LocalizedMessageHolder messageHolder, Throwable cause) {
        super(messageHolder, cause);
        this.request = request;
    }

    /**
     * Ctor
     * 
     * @param messageHolder the {@link LocalizedMessageHolder}
     * @param cause the {@link Throwable}
     */
    public HydraException(LocalizedMessageHolder messageHolder, Throwable cause) {
        super(messageHolder, cause);
    }

    /**
     * C'tor
     * 
     * @param messageHolder the {@link LocalizedMessageHolder}
     */
    public HydraException(LocalizedMessageHolder messageHolder) {
        super(messageHolder);
    }
}